iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 10
1
Mobile Development

新手試試用Flutter做Netflix UI系列 第 10

[Day10]Flutter Netflix UI Detail頁面之劇集描述

  • 分享至 

  • xImage
  •  

大家好,今天我們要來繼續做Detail頁面的UI,之前跟前面幾篇用到比較不同的有BackdropFilter、ImageFilter.blur、AspectRatio、另外Text這次用到文字內容比較長,也有一些參數可以設定。

首先看到AspectRatio,利用這個Widget我們可以設定child的長寬比例

AspectRatio(
    aspectRatio: 9 / 16, //寬度高度比例9:16
    child: Image.asset(
          "assets/videophoto2.jpg",
         fit: BoxFit.cover,
     ),
),

再來是BackdropFilter,我們需要讓背景的圖片高斯模糊
這邊要注意的是這句說明applies the filter to widgets beneath the child
BackdropFilter會讓在child之下的部分模糊,所以child是會顯示出來的。
必須帶filter ImageFilter,這邊用blur

BackdropFilter(
                    filter: ImageFilter.blur(sigmaX: 10.0, sigmaY: 10.0),
                    child: Padding(
                      padding: const EdgeInsets.all(8.0),
                      child: AspectRatio(
                        aspectRatio: 9 / 16,
                        child: Image.asset(
                          "assets/videophoto2.jpg",
                          fit: BoxFit.cover,
                        ),
                      ),
                    ),
                  ),

最後今天用到比較特別的是Text,先前我們沒有特別做什麼設定
但今天因為有一段文字敘述特別多
我們可以設定maxLines 以及overflow

接下來的code就是一些排版,先前都跟大家介紹過,大家可以看看

Widget _buildMainDetail() {
    return Container(
      height: MediaQuery.of(context).size.height * .8,
      child: Stack(
        fit: StackFit.expand,
        children: [
          Image.asset(
            "assets/videophoto2.jpg",
            fit: BoxFit.cover,
          ),
          Align(
            alignment: Alignment.bottomCenter,
            child: Column(
              mainAxisSize: MainAxisSize.min,
              crossAxisAlignment: CrossAxisAlignment.center,
              children: [
                Expanded(
                  child: BackdropFilter(
                    filter: ImageFilter.blur(sigmaX: 10.0, sigmaY: 10.0),
                    child: Padding(
                      padding: const EdgeInsets.all(8.0),
                      child: AspectRatio(
                        aspectRatio: 9 / 16,
                        child: Image.asset(
                          "assets/videophoto2.jpg",
                          fit: BoxFit.cover,
                        ),
                      ),
                    ),
                  ),
                ),
                Row(
                  mainAxisAlignment: MainAxisAlignment.center,
                  children: [
                    Text(
                      "98%適合您",
                      style: TextStyle(color: Colors.green),
                    ),
                    Text(" 2020 "),
                    Text(" 13+ "),
                    Text(" 1季 ")
                  ],
                ),
                Padding(
                  padding: const EdgeInsets.all(4.0),
                  child: Text(
                    "第1季上線",
                    style: TextStyle(fontSize: 16.0),
                  ),
                ),
                ClipRRect(
                  borderRadius: BorderRadius.circular(4.0),
                  child: Container(
                    margin: EdgeInsets.symmetric(vertical: 4.0),
                    width: double.infinity,
                    padding: EdgeInsets.all(4.0),
                    color: Colors.white,
                    child: Row(
                      mainAxisAlignment: MainAxisAlignment.center,
                      children: [
                        Icon(
                          Icons.play_arrow,
                          size: 30,
                          color: Colors.black,
                        ),
                        SizedBox(
                          width: 8.0,
                        ),
                        Text(
                          "播放",
                          style: TextStyle(color: Colors.black, fontSize: 18),
                        )
                      ],
                    ),
                  ),
                ),
                ClipRRect(
                  borderRadius: BorderRadius.circular(4.0),
                  child: Container(
                    margin: EdgeInsets.symmetric(vertical: 4.0),
                    width: double.infinity,
                    padding: EdgeInsets.all(4.0),
                    color: Color(0xff555555),
                    child: Row(
                      mainAxisAlignment: MainAxisAlignment.center,
                      children: [
                        Icon(
                          Icons.file_download,
                          size: 30,
                          color: Colors.white,
                        ),
                        SizedBox(
                          width: 8.0,
                        ),
                        Text(
                          "下載第1季第1集",
                          style: TextStyle(color: Colors.white, fontSize: 18),
                        )
                      ],
                    ),
                  ),
                ),
                SizedBox(
                  height: 8.0,
                ),
                Text(
                    "主角本條楓在好友白峰理沙推薦下開始遊玩遊戲「NewWorld Online」,創建了名為「梅普露」的角色。作為遊戲初學者,梅普露選擇了不受歡迎的大盾當武器,並因為怕痛而將所有資源用於增進防禦能力,這種形式讓她學到了各種特殊技能並取得罕見裝備,進而在遊戲中創下傳說。",
                    maxLines: 3,
                    overflow: TextOverflow.ellipsis),
                Align(
                    alignment: Alignment.centerLeft,
                    child: Text(
                      "主演:本渡楓,野口瑠璃子,早見沙織",
                      style: TextStyle(color: Colors.grey),
                    )),
                Padding(
                  padding: const EdgeInsets.symmetric(vertical: 16.0),
                  child: Row(
                    mainAxisAlignment: MainAxisAlignment.start,
                    children: [
                      Column(
                        mainAxisSize: MainAxisSize.min,
                        children: [
                          Icon(Icons.add),
                          Text('我的片單'),
                          SizedBox(
                            width: 80,
                          )
                        ],
                      ),
                      Column(
                        mainAxisSize: MainAxisSize.min,
                        children: [
                          Icon(Icons.thumb_up),
                          Text("評分"),
                          SizedBox(
                            width: 80.0,
                          )
                        ],
                      ),
                      Column(
                        mainAxisSize: MainAxisSize.min,
                        children: [
                          Icon(Icons.share),
                          Text("分享"),
                          SizedBox(
                            width: 80.0,
                          )
                        ],
                      ),
                    ],
                  ),
                )
              ],
            ),
          )
        ],
      ),
    );
  }

今天完成的效果
day10

GitHub連結: flutter-netflix-clone


上一篇
[Day9]Flutter Netflix UI 跳轉頁面如何讓底部導航欄不消失
下一篇
[Day11]Flutter Netflix UI 顯示Episode列表
系列文
新手試試用Flutter做Netflix UI30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言